home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / docs / asm_guide / examples / systemstartup.s < prev    next >
Text File  |  1991-10-24  |  9KB  |  386 lines

  1. ;*******************************************************
  2. ;*    SystemStartUp example that opens a screen and    *
  3. ;*          enables you to read the keyboard           *
  4. ;*                                                     *
  5. ;*      ASM-One example coded by Rune Gram-Madsen      *
  6. ;*                                                     *
  7. ;*       All rights reserved. Copyright (c) 1990       *
  8. ;*******************************************************
  9.  
  10. ; This example could have been coded shorter using includefiles. But
  11. ; I think it is nice to have it all in one single program.
  12.  
  13. IECLASS_RAWKEY = $01
  14. OPENLIB =    -408
  15. CLOSELIB =    -414
  16. OPENSCREEN =    -198
  17. CLOSESCREEN =    -66
  18. OPENWINDOW =    -204
  19. CLOSEWINDOW =    -72
  20. OPENDEVICE =    -444
  21. CLOSEDEVICE =    -450
  22. RAWKEYCONVERT=    -$30
  23. FINDTASK =    -294
  24. WAITPORT =    -384
  25. REPLYMSG =    -378
  26. GETMSG =    -372
  27. LOADRGB4 =     -192
  28.  
  29. RAWKEY      =    $00000400
  30.  
  31. BACKDROP    =    $00000100
  32. BORDERLESS    =    $00000800
  33. ACTIVATE    =    $00001000
  34. RMBTRAP        =    $00010000
  35.  
  36. CUSTOMSCREEN    =    $000F
  37.  
  38. V_HIRES        =    $8000
  39. NULL        =    0
  40.  
  41. ;********************************
  42. ;*    System startup routine    *
  43. ;********************************
  44.  
  45. J    BSR.S    STARTUP
  46.     BEQ.S    .ERROR        ; An error ?
  47.  
  48. ;---  Place your main routine here  ---
  49.  
  50. .LOOP    BSR.W    KEYB_GETKEY    ; Get key
  51.     CMP.B    #' ',D0
  52.     BNE.S    .LOOP        ; A space ?? No jump again
  53.  
  54.     BRA.S    CLOSEDOWN    ; Closedown
  55. .ERROR:    RTS
  56.  
  57. ;********  Open up system structures  ********
  58.  
  59. STARTUP:
  60.     MOVE.L    A7,ERROR_STACK    ; Save stack pointer if an error
  61.     BSR.L    TASK_FIND
  62.     BSR.L    INTULIB_OPEN
  63.     BSR.L    GRAPHLIB_OPEN
  64.     BSR.L    SCREEN_OPEN
  65.     BSR.L    WINDOW_OPEN
  66.     BSR.L    KEYB_INIT
  67.     BSR.L    COLORS_SET
  68.     MOVEQ    #-1,D0        ; Set ok value
  69.     RTS
  70.  
  71. ;--- An error has occured ---
  72.  
  73. STARTUP_ERROR:
  74.     MOVE.L    ERROR_STACK,A7    ; Restore old stackpointer
  75.     MOVEQ    #0,D0        ; Set error value
  76.     RTS            ; Return to main to main routine
  77.  
  78. ;*******  Close down system structures  *********
  79.  
  80. CLOSEDOWN:
  81.     BSR.S    KEYB_EXIT
  82.     BSR.L    WINDOW_CLOSE
  83.     BSR.L    SCREEN_CLOSE
  84.     BSR.L    GRAPHLIB_CLOSE
  85.     BRA.S    INTULIB_CLOSE
  86.  
  87. ;*******  Find our task  *******
  88.  
  89. TASK_FIND:
  90.     SUB.L    A1,A1        ; a1 = 0 Our task
  91.     MOVE.L    $4.W,A6        ; Exec pointer    
  92.     JSR    FINDTASK(A6)    ; Call Findtask
  93.     MOVE.L    D0,TASK_PTR    ; Store the pointer for our task
  94.     RTS
  95.  
  96. ;*******  Set the screen colors *******
  97.  
  98. COLORS_SET:
  99.     MOVE.L    SCREEN_HANDLE(PC),A0    ; Get screen handle
  100.     LEA.L    44(A0),A0        ; Get the screens viewport
  101.  
  102.     MOVE.L    GRAPHICS_BASE(PC),A6
  103.     LEA.L    COLORS(PC),A1        ; Pointer to the color list
  104.     MOVEQ    #32,D0            ; 32 colors to set
  105.     JMP    LOADRGB4(A6)        ; Set the colors
  106.  
  107. ;****** Initialize keyboardroutine *******
  108.  
  109. KEYB_INIT:
  110.     MOVE.L    $4.W,A6
  111.     LEA    CONSOLE_NAME(PC),A0    ; Pointer to "Console.Device"
  112.     LEA    IO_REQUEST(PC),A1    ; Io Buffer
  113.     MOVEQ    #-1,D0            ; Flags
  114.     MOVEQ    #0,D1            ; Unit
  115.     JSR    OPENDEVICE(A6)        
  116.     TST.L    D0            ; An error
  117.     BNE.S    STARTUP_ERROR        ; Error quit !!
  118.  
  119.     MOVE.L    IO_REQUEST+20,CONSOLE_DEVICE    ; Get console device
  120.     MOVE.L    WINDOW_HANDLE(PC),A0    ; Window Handle
  121.     MOVE.L    $56(A0),KEY_PORT    ; Get this windows keyport
  122.     RTS
  123.  
  124. ;****** Exit keyboard ******
  125.  
  126. KEYB_EXIT:
  127.     LEA    IO_REQUEST(PC),A1
  128.     MOVE.L    $4.W,A6
  129.     JMP    CLOSEDEVICE(A6)
  130.  
  131. ;******* Open Intution-Library *******
  132.  
  133. INTULIB_OPEN:
  134.     MOVE.L    $4.W,A6
  135.     LEA    INTUITION_NAME(PC),A1    ; Pointer to "intuition.library"
  136.     JSR    OPENLIB(A6)
  137.     MOVE.L    D0,INTUITION_BASE    ; Store pointer
  138.     BEQ.L    STARTUP_ERROR        ; If error jump
  139.     RTS
  140.  
  141. ;******* Close intution-library *******
  142.  
  143. INTULIB_CLOSE:
  144.     MOVE.L    $4.W,A6
  145.     MOVE.L    INTUITION_BASE(PC),A1
  146.     JMP    CLOSELIB(A6)
  147.  
  148. ;******* Open Graphics-Library *******
  149.  
  150. GRAPHLIB_OPEN:
  151.     MOVE.L    $4.W,A6
  152.     LEA    GRAPHICS_NAME(PC),A1    ; Pointer to "graphics.library"
  153.     JSR    OPENLIB(A6)
  154.     MOVE.L    D0,GRAPHICS_BASE    ; Store pointer
  155.     BEQ.L    STARTUP_ERROR        ; If error jump
  156.     RTS
  157.  
  158. ;******* Close Graphics-library *******
  159.  
  160. GRAPHLIB_CLOSE:
  161.     MOVE.L    $4.W,A6
  162.     MOVE.L    GRAPHICS_BASE(PC),A1
  163.     JMP    CLOSELIB(A6)
  164.  
  165. ;******* Open Main Screen *******
  166.  
  167. SCREEN_OPEN:
  168.     LEA.L    SCREEN_DEFS(PC),A0    ; Pointer to screen definitions
  169.     MOVE.L    INTUITION_BASE(PC),A6    ; Get intuition base
  170.     JSR    OPENSCREEN(A6)        ; Open the screen
  171.     MOVE.L    D0,SCREEN_HANDLE
  172.     BEQ.L    STARTUP_ERROR        ; If not opened => error
  173.     MOVE.L    D0,A0
  174.     LEA.L    $C0(A0),A0        ; Get bitplane pointers
  175.     LEA.L    BITPLANE1_PTR(PC),A1
  176.     MOVE.L    (A0)+,(A1)+        ; Bitplane 1
  177.     MOVE.L    (A0)+,(A1)+        ; Bitplane 2
  178.     MOVE.L    (A0)+,(A1)+        ; Bitplane 3
  179.     MOVE.L    (A0)+,(A1)+        ; Bitplane 4
  180.     MOVE.L    (A0)+,(A1)+        ; Bitplane 5
  181.     RTS
  182.  
  183. ;******* Close Main Screen *******
  184.  
  185. SCREEN_CLOSE:
  186.     MOVE.L    SCREEN_HANDLE(PC),A0
  187.     MOVE.L    INTUITION_BASE(PC),A6
  188.     JMP    CLOSESCREEN(A6)
  189.  
  190. ;******* OPEN MAIN WINDOW *******
  191.  
  192. WINDOW_OPEN:
  193.     MOVE.L    INTUITION_BASE(PC),A6    ; Pointer to intuition library
  194.     LEA    WINDOW_DEFS(PC),A0    ; Pointer to window definitions
  195.     JSR    OPENWINDOW(A6)
  196.     MOVE.L    D0,WINDOW_HANDLE    ; Store window handle
  197.     BEQ.L    STARTUP_ERROR        ; Error jump
  198.     MOVE.L    TASK_PTR(PC),A0        ; Get task pointer
  199.     MOVE.L    $B8(A0),TASK_OLDWINDOW    ; Store the old window
  200.     MOVE.L    D0,$B8(A0)        ; Make Reguesters turn up on this
  201.     RTS                ; Window
  202.     
  203. ;******* CLOSE MAIN WINDOW *******
  204.  
  205. WINDOW_CLOSE:
  206.     MOVE.L    TASK_PTR(PC),A0        ; Get task ptr
  207.     MOVE.L    TASK_OLDWINDOW(PC),$B8(A0)    ; Restore old window
  208.     MOVE.L    INTUITION_BASE(PC),A6
  209.     MOVE.L    WINDOW_HANDLE(PC),A0
  210.     JMP    CLOSEWINDOW(A6)
  211.  
  212. ;******* GET KEY PRESS *******
  213.  
  214. KEYB_GETKEY:
  215.     MOVE.W    KEYB_OUTBUFFER(PC),D0    ; Buffer output pointer
  216.     CMP.W    KEYB_INBUFFER(PC),D0    ; Is buffer empty
  217.     BNE.S    KEYB_STILLKEYSINBUFFER    ; No ??
  218.     BSR.L    KEYB_GETKEYS        ; Empty, Wait on a key from
  219.     BRA.S    KEYB_GETKEY        ; the keyboard
  220.  
  221. KEYB_STILLKEYSINBUFFER:
  222.     ADDQ.B    #1,KEYB_OUTBUFFER+1    ; Increase out pointer
  223.     LEA    KEYB_BUFFER(PC),A0    ; Pointer to buffer
  224.     MOVE.B    (A0,D0.W),D0        ; Get the oldest key
  225.     RTS
  226.  
  227. ;******* GET KEY STRING *******
  228.  
  229. KEYB_GETKEYS:
  230.     MOVE.L    KEY_PORT(PC),A5    ; Our key port
  231.     MOVE.L    A5,A0
  232.     MOVE.L    $4.W,A6
  233.     JSR    WAITPORT(A6)    ; Wait for message on the port
  234.     MOVE.L    A5,A0
  235.     JSR    GETMSG(A6)    ; Get the message
  236.     MOVE.L    D0,KEY_MSG
  237.     BEQ.S    KEYB_GETKEYS    ; No message, strange, jump again
  238.  
  239.     MOVE.L    D0,A3        ; Msg now in A3
  240.     MOVE.L    20(A3),D3    ; Get message type
  241.  
  242. ;---  Check if raw key  ---
  243.  
  244.     MOVE.L    D3,D1
  245.     AND.L    #RAWKEY,D1    ; Was it a raw key ??
  246.     BEQ.L    KEYB_ANSWER    ; If no just answer
  247.  
  248. ;---  Key Recieved  ---
  249.  
  250.     MOVE.W    24(A3),D4    ; Key code
  251.     BTST    #7,D4        ; Bit 7 - Key release
  252.     BNE.L    KEYB_ANSWER        ; We dont need them
  253.     MOVE.W    26(A3),D5    ; QUALIFIER
  254.     MOVE.L    28(A3),D6    ; IADDRESS
  255.     MOVE.W    D4,IECODE    ; TRANSFER CODE
  256.     MOVE.W    D5,IEQUAL    ; QUALIFIERS
  257.     MOVE.L    D6,IEADDR    ; AND POINTER TO OLD KEYS
  258.  
  259. ;---  Convert to ascii  ---
  260.  
  261.     LEA    MY_EVENT,A0    ; Pointer to event structure
  262.     LEA    KEY_BUFFER,A1    ; Convert buffer
  263.     MOVEQ    #80,D1        ; Max 80 characters
  264.     SUB.L    A2,A2        ; A2 = 0 Keymap - Default
  265.     MOVE.L    CONSOLE_DEVICE,A6
  266.     JSR    RAWKEYCONVERT(A6) ; Convert the rawkey into Ascii
  267.  
  268. ;---  Copy keys to buffer  ---
  269.  
  270. ; d0 = number of chars in the convert buffer
  271.  
  272. KEYB_COPY_D0_CHARS:
  273.     SUBQ.W    #1,D0
  274.     BMI.S    KEYB_ANSWER        ; No chars ??
  275.     LEA    KEY_BUFFER(PC),A1
  276.     LEA    KEYB_BUFFER(PC),A0
  277.     MOVE.W    KEYB_INBUFFER,D1
  278. .LOOP:    MOVE.B    (A1)+,(A0,D1.W)        ; Copy the keys to the normal
  279.     ADDQ.B    #1,D1            ;  buffer.
  280.     DBF    D0,.LOOP
  281.     MOVE.W    D1,KEYB_INBUFFER
  282.     BRA.L    KEYB_ANSWER        ; Answer
  283.  
  284. ;******* ANSWER KEYPRESS *******
  285.  
  286. KEYB_ANSWER:
  287.     MOVE.L    KEY_MSG(PC),A1
  288.     MOVE.L    $4.W,A6
  289.     JMP    REPLYMSG(A6)        ; Reply the message
  290.  
  291. SCREEN_DEFS:
  292.     DC.W    0,0        ; X-Y position
  293.     DC.W    320        ; Width
  294.     DC.W    200        ; Hight
  295.     DC.W    5        ; Depth
  296.     DC.B    0,1        ; Pen colors
  297.     DC.W    0        ; V_HIRES
  298.     DC.W    CUSTOMSCREEN
  299.     DC.L    FONT_ATTR    ; use Topaz 8 as standard font
  300.     DC.L    SCREEN_NAME
  301.     DC.L    0
  302.     DC.L    0
  303.  
  304. ;***  Window structure  ***
  305.  
  306. WINDOW_DEFS:
  307.     dc.w    0,0        ; X-Y position
  308.     dc.w    320        ; Current width
  309.     dc.w    200        ; Current higth
  310.     dc.b    0,1
  311.     dc.l    RAWKEY        ; Report only raw keys
  312.     dc.l    BACKDROP+BORDERLESS+ACTIVATE+RMBTRAP
  313.     dc.l    NULL
  314.     dc.l    NULL
  315.     DC.L    REQUESTER_NAME    ; Window name
  316. SCREEN_HANDLE:
  317.     dc.l    NULL    ;custom screen pointer
  318.     dc.l    NULL
  319.     dc.w    320        ; Min width 
  320.     dc.w    200        ; Min higth
  321.     dc.w    320        ; Max width
  322.     dc.w    200        ; Max higth
  323.     dc.w    CUSTOMSCREEN    ; A normal window
  324.     EVEN
  325.  
  326. ;---  Topaz font  ---
  327.  
  328. FONT_ATTR:
  329.     DC.L    FONT_NAME    ; Name
  330.     DC.W    8        ; Size
  331.     DC.B    0
  332.     DC.B    0
  333.     DC.W    8        ; Size
  334.  
  335. COLORS:
  336.     DC.W    $0000,$000F,$000E,$000D
  337.     DC.W    $000C,$000B,$000A,$0009
  338.     DC.W    $0008,$0007,$0106,$0205
  339.     DC.W    $0304,$0403,$0502,$0611
  340.     DC.W    $0720,$0831,$0942,$0A53
  341.     DC.W    $0B64,$0C75,$0D86,$0C97
  342.     DC.W    $0BA8,$0A9A,$098B,$0879
  343.     DC.W    $0767,$0555,$0343,$0131
  344.  
  345. FONT_NAME:        DC.B    'topaz.font',0
  346. CONSOLE_NAME:        DC.B    'console.device',0,0
  347. REQUESTER_NAME:        DC.B    'My Requester',0
  348. SCREEN_NAME:        DC.B    'My Screen - <SPACE> to quit',0
  349. INTUITION_NAME:        DC.B    'intuition.library',0
  350. GRAPHICS_NAME:        DC.B    'graphics.library',0
  351.     even
  352. CONSOLE_DEVICE:        DC.L    0
  353. INTUITION_BASE:        DC.L    0
  354. GRAPHICS_BASE:        DC.L    0
  355. TASK_OLDWINDOW:        DC.L    0
  356.  
  357. BITPLANE1_PTR:        DC.L    0
  358. BITPLANE2_PTR:        DC.L    0
  359. BITPLANE3_PTR:        DC.L    0
  360. BITPLANE4_PTR:        DC.L    0
  361. BITPLANE5_PTR:        DC.L    0
  362.  
  363. TASK_PTR:        DC.L    0
  364.  
  365. KEYB_BUFFER:        DCB.B    256,0
  366. KEYB_OUTBUFFER:        DC.W    0
  367. KEYB_INBUFFER:        DC.W    0
  368.  
  369. ERROR_STACK:        DC.W    0
  370.  
  371. IO_REQUEST:        DCB.B    32,0
  372. KEY_BUFFER:        DCB.B    80,0
  373. KEY_PORT:        DC.L    0
  374. KEY_MSG:        DC.L    0
  375.  
  376. MY_EVENT:    DC.L    0    ; Insert after each event
  377. EVENT_IECLASS:    DC.B    IECLASS_RAWKEY
  378.         DC.B    0    ; SUBCLASS - A Joke
  379. IECODE:        DC.W    0    ; RAWKEY - Inserted
  380. IEQUAL:        DC.W    0    ; QUALIFIER - SHIFT, CTRL, ETC.
  381. IEADDR:        DC.L    0    ; IAddress
  382.         DC.L    0
  383.         DC.L    0    ; TimeStamp
  384. WINDOW_HANDLE:    DC.L    0
  385.  
  386.